// var $pPSDK_Config = require("./AL_Framework_AL_SDK_CONFIG");
// var $macros = require("./AL_Framework_Macros");
// var a = (function () {
//     function e() {
//         var e = this;
//         this.logTag = "[AL_Framework_AudioManager]:";
//         this.musicOption = {};
//         Manager.eventCenter.on(
//             $macros.Macro.CHANGE_MUSIC_EVENT,
//             function (t) {
//                 t ? e.bgmName && e.bgmBundle && e.playMusic(e.bgmName, e.bgmBundle, e.musicOption) : e.stopMusic();
//             },
//             this
//         );
//         cc.game.on(
//             cc.game.EVENT_SHOW,
//             function () {
//                 e.resumeMusic();
//             },
//             this
//         );
//     }
//     e.Instance = function () {
//         return this._instance || (this._instance = new e());
//     };
//     e.prototype.playMusic = function (e, t, o) {
//         var i = this;
//         if (void 0 === t) {
//             t = $macros.Macro.BUNDLE_RESOURCES;
//         }
//         return new Promise(function (n) {
//             i.bgmName = e;
//             i.bgmBundle = t;
//             i.musicOption = o;
//             if (Manager.settingStorage.yinyue_kaiguan_zhuangtai) {
//                 i.getAudio(e, t)
//                     .then(function (t) {
//                         if (t) {
//                             if (o.force || t !== i.bgmClip) {
//                                 i.bgmClip = t;
//                                 var a = !0;
//                                 if (0 == o.loop) {
//                                     a = !1;
//                                 }
//                                 var s = cc.audioEngine.getMusicVolume();
//                                 if ("number" == typeof o.volume) {
//                                     s = o.volume;
//                                 }
//                                 var r = cc.audioEngine.playMusic(t, a);
//                                 i.bgmId = r;
//                                 cc.audioEngine.setMusicVolume(s);
//                                 return void n({
//                                     url: e,
//                                     id: r,
//                                     success: !0
//                                 });
//                             }
//                             n({
//                                 url: e,
//                                 id: i.bgmId,
//                                 success: !0
//                             });
//                         } else {
//                             n({
//                                 url: e,
//                                 success: !1
//                             });
//                         }
//                     })
//                     .catch(function () {
//                         n({
//                             url: e,
//                             success: !1
//                         });
//                     });
//             }
//         });
//     };
//     e.prototype.bofang_yinxiao = function (e, t, o) {
//         var i = this;
//         if (void 0 === o) {
//             o = {};
//         }
//         return new Promise(function (n) {
//             if (Manager.settingStorage.yinxiao_kaiguan_zhuangtai) {
//                 i.getAudio(e, t)
//                     .then(function (t) {
//                         if (t) {
//                             var i = cc.audioEngine.getEffectsVolume();
//                             if ("number" == typeof o.volume) {
//                                 i = o.volume;
//                             }
//                             var a = cc.audioEngine.play(t, o.loop || !1, i);
//                             n({
//                                 url: e,
//                                 id: a,
//                                 success: !0
//                             });
//                         } else {
//                             n({
//                                 url: e,
//                                 success: !1
//                             });
//                         }
//                     })
//                     .catch(function () {
//                         n({
//                             url: e,
//                             success: !1
//                         });
//                     });
//             }
//         });
//     };
//     e.prototype.bofang_yinxiao_jianji = function (e, t) {
//         if (void 0 === t) {
//             t = {};
//         }
//         if (Manager.settingStorage.yinxiao_kaiguan_zhuangtai) {
//             var o = cc.audioEngine.getEffectsVolume();
//             if ("number" == typeof t.volume) {
//                 o = t.volume;
//             }
//             return cc.audioEngine.play(e, t.loop || !1, o);
//         }
//         return null;
//     };
//     e.prototype.stopMusic = function () {
//         if (cc.audioEngine.isMusicPlaying) {
//             cc.audioEngine.stopMusic();
//         }
//         this.bgmClip = null;
//     };
//     e.prototype.tingzhi_yinxiao = function (e) {
//         cc.audioEngine.stop(e);
//     };
//     e.prototype.pauseMusic = function () {
//         cc.audioEngine.pauseMusic();
//     };
//     e.prototype.resumeMusic = function () {
//         if (AL_APP_SDK_MANAGER.settingStorage.yinyue_kaiguan_zhuangtai) {
//             cc.audioEngine.resumeMusic();
//         }
//     };
//     e.prototype.qingchu_beijing_yinyue_shuju = function () {
//         this.bgmName = null;
//         this.bgmBundle = null;
//         this.bgmId = null;
//         this.musicOption = {};
//     };
//     e.prototype.shezhi_zidingyi_anniu_yinxiao = function (e) {
//         $pPSDK_Config.Config.buttonSfx = e;
//     };
//     e.prototype.getAudio = function (e, t) {
//         var o = this;
//         return new Promise(function (i, n) {
//             if (!cc.assetManager.getBundle(t)) {
//                 Log.e(o.logTag, "bundle 不存在:" + t);
//                 return n();
//             }
//             AL_APP_SDK_MANAGER.cacheManager.yibuHuoquHuancun(e, cc.AudioClip, t).then(function (e) {
//                 if (e) {
//                     i(e);
//                 }
//             });
//         });
//     };
//     e._instance = null;
//     return e;
// })();
// exports.default = a;


const AL_Framework_AL_SDK_CONFIG = require("./AL_Framework_AL_SDK_CONFIG");
const AL_Framework_Macros = require("./AL_Framework_Macros");

/**
 * 音频管理类
 */
class AL_Framework_AudioManager {
    constructor() {
        this.logTag = "[AL_Framework_AudioManager]:";
        this.bgmName = null;
        this.bgmBundle = null;
        this.bgmId = null;
        this.bgmClip = null;
        this.musicOption = {};

        Manager.eventCenter.on(
            AL_Framework_Macros.Macro.CHANGE_MUSIC_EVENT,
            (event) => {
                if (event) {
                    if (this.bgmName && this.bgmBundle) {
                        this.playMusic(this.bgmName, this.bgmBundle, this.musicOption);
                    }
                } else {
                    this.stopMusic();
                }
            },
            this
        );

        cc.game.on(
            cc.game.EVENT_SHOW,
            () => {
                this.resumeMusic();
            },
            this
        );
    }

    /**
     * 获取单例实例
     * @returns {AL_Framework_AudioManager}
     */
    static Instance() {
        if (!this._instance) {
            this._instance = new AL_Framework_AudioManager();
        }
        return this._instance;
    }

    /**
     * 播放背景音乐
     * @param {string} audioName 音频名称
     * @param {string} [bundle=AL_Framework_Macros.Macro.BUNDLE_RESOURCES] 资源包名
     * @param {object} [options={}] 音频选项
     * @returns {Promise<object>}
     */
    playMusic(audioName, bundle = AL_Framework_Macros.Macro.BUNDLE_RESOURCES, options = {}) {
        return new Promise((resolve) => {
            this.bgmName = audioName;
            this.bgmBundle = bundle;
            this.musicOption = options;

            if (Manager.settingStorage.yinyue_kaiguan_zhuangtai) {
                this.getAudio(audioName, bundle)
                    .then((audioClip) => {
                        if (audioClip) {
                            if (options.force || audioClip !== this.bgmClip) {
                                this.bgmClip = audioClip;
                                const isLoop = options.loop !== 0;
                                let volume = cc.audioEngine.getMusicVolume();
                                if (typeof options.volume === 'number') {
                                    volume = options.volume;
                                }
                                const bgmId = cc.audioEngine.playMusic(audioClip, isLoop);
                                this.bgmId = bgmId;
                                cc.audioEngine.setMusicVolume(volume);
                                resolve({ url: audioName, id: bgmId, success: true });
                            } else {
                                resolve({ url: audioName, id: this.bgmId, success: true });
                            }
                        } else {
                            resolve({ url: audioName, success: false });
                        }
                    })
                    .catch(() => {
                        resolve({ url: audioName, success: false });
                    });
            }
        });
    }

    /**
     * 播放音效
     * @param {string} audioName 音频名称
     * @param {string} [bundle] 资源包名
     * @param {object} [options={}] 音频选项
     * @returns {Promise<object>}
     */
    bofang_yinxiao(audioName, bundle, options = {}) {
        return new Promise((resolve) => {
            if (Manager.settingStorage.yinxiao_kaiguan_zhuangtai) {
                this.getAudio(audioName, bundle)
                    .then((audioClip) => {
                        if (audioClip) {
                            let volume = cc.audioEngine.getEffectsVolume();
                            if (typeof options.volume === 'number') {
                                volume = options.volume;
                            }
                            const sfxId = cc.audioEngine.play(audioClip, options.loop || false, volume);
                            resolve({ url: audioName, id: sfxId, success: true });
                        } else {
                            resolve({ url: audioName, success: false });
                        }
                    })
                    .catch(() => {
                        resolve({ url: audioName, success: false });
                    });
            }
        });
    }

    /**
     * 播放音效剪辑
     * @param {cc.AudioClip} audioClip 音频剪辑
     * @param {object} [options={}] 音频选项
     * @returns {number | null}
     */
    bofang_yinxiao_jianji(audioClip, options = {}) {
        if (Manager.settingStorage.yinxiao_kaiguan_zhuangtai) {
            let volume = cc.audioEngine.getEffectsVolume();
            if (typeof options.volume === 'number') {
                volume = options.volume;
            }
            return cc.audioEngine.play(audioClip, options.loop || false, volume);
        }
        return null;
    }

    /**
     * 停止背景音乐
     */
    stopMusic() {
        if (cc.audioEngine.isMusicPlaying) {
            cc.audioEngine.stopMusic();
        }
        this.bgmClip = null;
    }

    /**
     * 停止音效
     * @param {number} sfxId 音效ID
     */
    tingzhi_yinxiao(sfxId) {
        cc.audioEngine.stop(sfxId);
    }

    /**
     * 暂停背景音乐
     */
    pauseMusic() {
        cc.audioEngine.pauseMusic();
    }

    /**
     * 恢复背景音乐
     */
    resumeMusic() {
        if (AL_APP_SDK_MANAGER.settingStorage.yinyue_kaiguan_zhuangtai) {
            cc.audioEngine.resumeMusic();
        }
    }

    /**
     * 清除背景音乐数据
     */
    qingchu_beijing_yinyue_shuju() {
        this.bgmName = null;
        this.bgmBundle = null;
        this.bgmId = null;
        this.musicOption = {};
    }

    /**
     * 设置自定义按钮音效
     * @param {string} buttonSfx 按钮音效
     */
    shezhi_zidingyi_anniu_yinxiao(buttonSfx) {
        AL_Framework_AL_SDK_CONFIG.Config.buttonSfx = buttonSfx;
    }

    /**
     * 获取音频
     * @param {string} audioName 音频名称
     * @param {string} bundle 资源包名
     * @returns {Promise<cc.AudioClip>}
     */
    getAudio(audioName, bundle) {
        return new Promise((resolve, reject) => {
            if (!cc.assetManager.getBundle(bundle)) {
                Log.e(this.logTag, "bundle 不存在:" + bundle);
                return reject();
            }
            AL_APP_SDK_MANAGER.cacheManager.yibuHuoquHuancun(audioName, cc.AudioClip, bundle).then((clip) => {
                if (clip) {
                    resolve(clip);
                }
            });
        });
    }
}

AL_Framework_AudioManager._instance = null;

exports.default = AL_Framework_AudioManager;
